package com.symc.his.api.impl.patient;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.symc.his.api.base.BaseApiService;
import com.symc.his.api.base.BaseResponse;
import com.symc.his.api.impl.entity.PatientInfoDO;
import com.symc.his.api.impl.feign.WeChatServiceFeign;
import com.symc.his.api.impl.mapper.PatientInfoMapper;
import com.symc.his.api.patient.PatientService;
import com.symc.his.api.patient.dto.req.PatientInfoReqDTO;
import com.symc.his.api.patient.dto.resp.PatientInfoRespDTO;
import com.symc.his.api.impl.utils.SqlUtil;
import java.sql.Date;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description: 病人管理服务实现
 * @CreateTime: 2023/3/5 19:21
 * @Version:
 * @Since: 1.8
 * @Author: 辛凤文 forward.seen@foxmail.com
 */
@RestController
public class PatientServiceImpl extends BaseApiService implements PatientService {

    @Resource
    private PatientInfoMapper patientInfoMapper;

    @Resource
    private WeChatServiceFeign weChatServiceFeign;

    @Override public String testPatientService() {
        return "PatientService";
    }

    @Override public BaseResponse<String> testException() {
        int i = 1 / 0;
        return setResultSuccess();
    }

    @Override public BaseResponse<String> testParam(Integer a) {
        return setResultSuccess("a = " + a);
    }

    @Override public BaseResponse<PatientInfoRespDTO> updatePatientInfoDTO(PatientInfoReqDTO patientInfoReqDTO) {
        PatientInfoDO patientInfoDO = DTO2DO(patientInfoReqDTO, PatientInfoDO.class);
        int i = patientInfoMapper.updateById(patientInfoDO);
        if (i <= 0) {
            return setResultError("修改失败！");
        }
        Integer id = patientInfoDO.getPatientInfoId();
        PatientInfoDO patientInfoDO1 = patientInfoMapper.selectById(id);
        if (patientInfoDO == null) {
            return setResultError("查询数据为空");
        }
        PatientInfoRespDTO patientInfoRespDTO = DO2DTO(patientInfoDO1, PatientInfoRespDTO.class);
        return setResultSuccess(patientInfoRespDTO);
    }

    @Override public BaseResponse<String> feignWeChat(Integer a) {
        return setResultSuccess(weChatServiceFeign.getWeChat(a));
    }

    @Override public BaseResponse<PatientInfoRespDTO> getPatientInfoList() {
        QueryWrapper<PatientInfoDO> patientInfoDOQueryWrapper = new QueryWrapper<>();
        List<PatientInfoDO> patientInfoDOList = patientInfoMapper.selectList(patientInfoDOQueryWrapper);
        List<PatientInfoRespDTO> patientInfoRespDTOList = patientInfoDOList.stream().map(e -> DO2DTO(e, PatientInfoRespDTO.class)).collect(Collectors.toList());
        return setResultSuccess(patientInfoRespDTOList);
    }

    @Override public BaseResponse<PatientInfoRespDTO> getPatientInfoByPatientId(String patientId) {
        LambdaQueryWrapper<PatientInfoDO> queryWrapper = new LambdaQueryWrapper<PatientInfoDO>().eq(PatientInfoDO::getPatientId,patientId);
        PatientInfoDO patientInfoDO = patientInfoMapper.selectOne(queryWrapper);
        PatientInfoRespDTO infoRespDTO = DO2DTO(patientInfoDO, PatientInfoRespDTO.class);
        return setResultSuccess(infoRespDTO);
    }

    @Override public BaseResponse<PatientInfoRespDTO> getPatientInfoPage(Integer currentPageNum, Integer pageSize) {
        QueryWrapper<PatientInfoDO> patientInfoQueryWrapper = new QueryWrapper<>();
        Page<PatientInfoDO> page = new Page<>(currentPageNum, pageSize);
        Page<PatientInfoDO> patientInfoPage = patientInfoMapper.selectCurrentPage(page, patientInfoQueryWrapper);
        return setResultSuccess(patientInfoPage);
    }

    @Override public BaseResponse<PatientInfoRespDTO> queryPatientInfoList(PatientInfoReqDTO patientInfoReqDTO) {
        String patientIdPart = patientInfoReqDTO.getPatientId();
        String namePart = patientInfoReqDTO.getName();
        String identifyNoPart = patientInfoReqDTO.getIdentifyNo();
        List<PatientInfoDO> patientInfoDOS = patientInfoMapper.queryPatientInfoListByPatientIdAndNameAndIdentifyNo(patientIdPart, namePart, identifyNoPart);
        List<PatientInfoRespDTO> patientInfoRespDTO = patientInfoDOS.stream().map(e -> DO2DTO(e, PatientInfoRespDTO.class)).collect(Collectors.toList());
        return setResultSuccess(patientInfoRespDTO);
    }

    @Override public BaseResponse<PatientInfoRespDTO> queryPatientInfoPage(Integer currentPageNum, Integer pageSize,
        PatientInfoReqDTO patientInfoReqDTO) {
        String patientIdPart = patientInfoReqDTO.getPatientId();
        String namePart = patientInfoReqDTO.getName();
        String identifyNoPart = patientInfoReqDTO.getIdentifyNo();
        Long startRecordNum = SqlUtil.calcStartRecordByCurrentPage(currentPageNum.longValue(),pageSize.longValue());
        List<PatientInfoDO> patientInfoDOList = patientInfoMapper.queryPatientInfoPageByPatientIdAndNameAndIdentifyNo(patientIdPart, namePart, identifyNoPart, startRecordNum, pageSize.longValue());
        List<PatientInfoRespDTO> patientInfoPage = patientInfoDOList.stream().map(e -> DO2DTO(e, PatientInfoRespDTO.class)).collect(Collectors.toList());
        return setResultSuccess(patientInfoPage);
    }

    @Override public BaseResponse<PatientInfoRespDTO> addPatient(PatientInfoReqDTO patientInfoReqDTO) {
        PatientInfoDO patientInfo = DTO2DO(patientInfoReqDTO, PatientInfoDO.class);
        int insertRes = patientInfoMapper.insert(patientInfo);
        if (insertRes != 1 ) {
            return setResultError("插入失败！");
        }
        return setResultSuccess("插入成功！");
    }

    @Override public BaseResponse<PatientInfoRespDTO> queryPatientInfoByIdentifyNo(String identifyNo) {
        LambdaQueryWrapper<PatientInfoDO> queryWrapper = new LambdaQueryWrapper<PatientInfoDO>().eq(PatientInfoDO::getIdentifyNo, identifyNo);
        PatientInfoDO patientInfo = patientInfoMapper.selectOne(queryWrapper);
        Date birthDate = patientInfo.getBirthDate();
        long livedDays = DateUtil.between(birthDate, new java.util.Date(), DateUnit.DAY);
        long age = livedDays / 365;
        patientInfo.setAge(Long.toString(age));
        PatientInfoRespDTO patientInfoRespDTO = DO2DTO(patientInfo, PatientInfoRespDTO.class);
        return setResultSuccess(patientInfoRespDTO);
    }
}